home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-26 | 17.7 KB | 491 lines | [TEXT/MPS ] |
- // DirectCopyExtender.c
- //
- // This file contains code for the Simple Atom Extender example. The
- // Atom Extender defined below simulates the Installer's default copy
- // task.
- //
- //
- // Copyright 1993-1996, Apple Computer, Inc., All Rights Reserved
- //
- //
-
- #ifndef __Errors__
- #include <Errors.h>
- #endif
-
- #ifndef __Memory__
- #include <Memory.h>
- #endif
-
- #ifndef __OSUtils__
- #include <OSUtils.h>
- #endif
-
- #ifndef __Packages__
- #include <Packages.h>
- #endif
-
- #include <TextUtils.h>
-
- #ifndef __InstallerScript__
- #include "InstallerScript.h"
- #endif
-
- #ifndef __ActionHandlerHeader__
- #include "ActionHandlerHeader.h"
- #endif
-
- void DisplayAtomExtenderInfo( ExtenderPBPtr pExtenderPBPtr, ExtenderResultCode pResultCode );
-
- ExtenderResultCode DirectCopyExtender( ExtenderPBPtr pExtenderPBPtr )
- {
- OSErr theErr;
- long dataLen;
- Ptr theBufferPtr;
- ExtenderResultCode resultCode;
-
- // -- Initalize some important variables
- dataLen = 30000;
- theErr = noErr;
-
- // -- Depending on the message, perform the proper task
- switch( pExtenderPBPtr->fFileCopyPBRec.fEnvironmentHeader.fMessageID ) {
-
- case kBeforePart:
-
- // -- Create a buffer
- theBufferPtr = NewPtr(dataLen);
-
- // -- Check that we got our buffer successfully
- if( theBufferPtr != NULL && MemError() == noErr ) {
-
- // -- Read as much as we can up to the size of the buffer.
- theErr = ReadSourceData( pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fCallBackProcPtr, &dataLen, theBufferPtr);
-
- // -- Loop while there is more data to read.
- while( dataLen > 0 ) {
-
-
- // -- DO SOMETHING TO THE DATA HERE, LIKE DECOMPRESSION IF YOU NEED TO
-
-
- // -- Write the data out.
- theErr = WriteTargetData( pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fCallBackProcPtr, dataLen, theBufferPtr);
-
- // -- Read as much as we can up to the size of the buffer.
- if( theErr == noErr ) {
- theErr = ReadSourceData( pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fCallBackProcPtr, &dataLen, theBufferPtr);
-
- // -- If we got an eofErr, then we know we're done, and dataLen will be 0 (zero).
- if( theErr == eofErr )
- theErr = noErr;
- }
-
- } // while not done copying
-
- if( theErr == noErr )
- resultCode = kCopiedData;
- else
- resultCode = kFatalError;
-
- // -- Dispose the buffer
- DisposPtr(theBufferPtr);
- }
- else
- resultCode = kFatalError;
-
- // Write some handy info to the Installer Debugger, if it is installed.
- DisplayAtomExtenderInfo( pExtenderPBPtr, resultCode );
- break;
-
- // -- We ignore the other messages.
- case kInitialize:
- case kAfterPart:
- case kSuccess:
- case kCancel:
- resultCode = kContinueAsNormal;
- break;
- }
-
- return resultCode;
- }
-
-
-
-
-
-
- // -------------------------------------------------------------------------------------------------------------------------------------
- // The routines below are for displaying the contents of the parameter block passed to the Atom Extender.
- // Call DisplayAtomExtenderInfo to write this information to the Installer Debugger.
-
- void MakeFilePath( FSSpec* pFileFSSpec, Str255 pFilePath )
- {
-
- CInfoPBRec cPBRec;
- Str255 directoryName = "";
- short i;
- OSErr theErr;
-
- // Get the file name
- for( i=0;i<=pFileFSSpec->name[0];i++)
- pFilePath[i] = pFileFSSpec->name[i];
-
- cPBRec.hFileInfo.ioCompletion = NULL;
- cPBRec.hFileInfo.ioNamePtr = directoryName;
- cPBRec.hFileInfo.ioFDirIndex = -1;
- cPBRec.hFileInfo.ioDirID = pFileFSSpec->parID;
- cPBRec.hFileInfo.ioVRefNum = pFileFSSpec->vRefNum;
- theErr = PBGetCatInfo( &cPBRec, 0 );
-
- // Preappend directoryName
- BlockMove( pFilePath + 1, pFilePath + directoryName[0] + 2, pFilePath[0] );
- for( i=1;i<=directoryName[0];i++)
- pFilePath[i] = directoryName[i];
- pFilePath[i] = ':';
- pFilePath[0] += directoryName[0] + 1;
-
- while ( theErr == noErr && cPBRec.dirInfo.ioDrParID != 1 && pFilePath[0] + directoryName[0] + 1 < 255 ) {
-
- // Preappend directoryName
- cPBRec.hFileInfo.ioDirID = cPBRec.dirInfo.ioDrParID;
- cPBRec.hFileInfo.ioFDirIndex = -1;
- theErr = PBGetCatInfo( &cPBRec, 0 );
-
- if( theErr == noErr ) {
- // Preappend directoryName
- BlockMove( pFilePath + 1, pFilePath + directoryName[0] + 2, pFilePath[0] );
- for( i=1;i<=directoryName[0];i++)
- pFilePath[i] = directoryName[i];
- pFilePath[i] = ':';
- pFilePath[0] += directoryName[0] + 1;
- }
- }
-
- }
-
- void PrintLine( InstallerCallBackUPP pCallBackProcPtr, Str255 pParam0, Str255 pParam1, Str255 pParam2, Str255 pParam3 )
- {
- long theResult;
- RegisterScriptAction( pCallBackProcPtr, kDebuggingAction, kGenericDebugActID, pParam0, pParam1, pParam2, pParam3, &theResult );
- }
-
- void DisplayAtomExtenderInfo( ExtenderPBPtr pExtenderPBPtr, ExtenderResultCode pResultCode )
- {
-
- StringPtr kBeginCallPart1 = "\p=>========================== Begin Atom Extender Call ==== ";
- StringPtr kBeginCallPart3 = "\p============================";
-
- StringPtr kEndCallPart1 = "\p-<-------------------------- End Atom Extender Call ------ ";
- StringPtr kEndCallPart3 = "\p----------------------------\n";
-
- StringPtr kRefConText = "\pRefCon: ";
-
- StringPtr kTargetVolNumText = "\p TargetVolumeRefNum: ";
- StringPtr kTargetBlessedDirIDText = "\p TargetBlessedDirID: ";
- StringPtr kBootVolNumText = "\p BootVolumeRefNum: ";
- StringPtr kBootBlessedDirIDText = "\p BootBlessedDirID: ";
-
- StringPtr kInitializeText = "\pInitialization Call =";
- StringPtr kSuccessText = "\pSuccessful Completion";
- StringPtr kBeforePartText = "\pBefore Part =========";
- StringPtr kAfterPartText = "\pAfter Part ==========";
- StringPtr kCancelText = "\pCANCELIZATION CALL ==";
-
- StringPtr kOkRtnMessageText ="\pContinue result returned --";
- StringPtr kCancelRtnMessageText ="\pCancel result returned ----";
- StringPtr kErrorRtnMessageText ="\pError result returned -----";
- StringPtr kCopiedDataMessageText ="\pCopied Data result returned";
-
- StringPtr kFileAtomDataForkText = "\pDataType: FileAtomDataFork";
- StringPtr kFileAtomRsrcForkText = "\pDataType: FileAtomRsrcFork";
- StringPtr kFileAtomRsrcForkFromDataForkText= "\pDataType: FileAtomRsrcForkFromDataFork";
- StringPtr kRsrcAtomText = "\pDataType: RsrcAtom";
- StringPtr kFontAtomText = "\pDataType: FontAtom";
- StringPtr kActionAtomText = "\pDataType: N/A";
-
- StringPtr kSourceFileText = "\pSource Info... ";
- StringPtr kTargetFileText = "\pTarget Info... ";
- StringPtr kFSSpecNameText = "\p File Path: ";
- StringPtr kPartSizeText = "\p Part Size: ";
- StringPtr kPosSizeText = "\p Start Pos: ";
- StringPtr kTotalSizeText = "\p Total Size: ";
-
- StringPtr kRsrcSourceRsrcTypeText = "\p Src Rsrc Type: ";
- StringPtr kRsrcSourceRsrcIDText = "\p Src Rsrc ID: ";
- StringPtr kRsrcTargetRsrcTypeText = "\p Tgt Rsrc Type: ";
- StringPtr kRsrcTargetRsrcIDText = "\p Tgt Rsrc ID: ";
- StringPtr kRsrcTargetRsrcNameText = "\p Rsrc Name: ";
- StringPtr kRsrcTargetRsrcAttrsText = "\p Rsrc Attrs: ";
-
- StringPtr kFontSourceRsrcTypeText = "\p Src Rsrc Type: ";
- StringPtr kFontSourceRsrcIDText = "\p Src Rsrc ID: ";
- StringPtr kFontTargetRsrcTypeText = "\p Tgt Rsrc Type: ";
- StringPtr kFontTargetRsrcIDText = "\p Tgt Rsrc ID: ";
- StringPtr kFontTargetRsrcNameText = "\p Rsrc Name: ";
- StringPtr kFontTargetRsrcAttrsText = "\p Rsrc Attrs: ";
- StringPtr kFontFamilyNameText = "\p Family Name: ";
- StringPtr kFontFamilyIDText = "\p Family ID: ";
- StringPtr kFontFontSizeText = "\p Font Size: ";
- StringPtr kFontFontStyleText = "\p Font Style: ";
-
- StringPtr kInstallerTempDirIDText = "\p Temp Directory: ";
-
- Str255 tempNumStr;
- Str255 tempStr255;
- FSSpec tempFSSpec;
- InstallerCallBackUPP theCallBackPtr = pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fCallBackProcPtr;
-
-
- // -- BASIC STUFF ----------------------------------------------------------------------
-
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fMessageID) {
- case kInitialize : PrintLine( theCallBackPtr, kBeginCallPart1, kInitializeText, kBeginCallPart3, "\p" );
- break;
- case kSuccess : PrintLine( theCallBackPtr, kBeginCallPart1, kSuccessText, kBeginCallPart3, "\p" );
- break;
- case kBeforePart : PrintLine( theCallBackPtr, kBeginCallPart1, kBeforePartText, kBeginCallPart3, "\p" );
- break;
- case kAfterPart : PrintLine( theCallBackPtr, kBeginCallPart1, kAfterPartText, kBeginCallPart3, "\p" );
- break;
- case kCancel : PrintLine( theCallBackPtr, kBeginCallPart1, kCancelText, kBeginCallPart3, "\p" );
- break;
- }
-
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fMessageID) {
- case kInitialize :
- case kSuccess :
- case kCancel :
- NumToString( pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fRefCon, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kRefConText, tempNumStr, "\p", "\p" );
- break;
-
- case kBeforePart :
- case kAfterPart :
-
- NumToString( pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fRefCon, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kRefConText, tempNumStr, "\p", "\p" );
-
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fDataType) {
- case kFileAtomDataFork : PrintLine( theCallBackPtr, kFileAtomDataForkText, "\p", "\p", "\p" );
- break;
- case kFileAtomRsrcFork : PrintLine( theCallBackPtr, kFileAtomRsrcForkText, "\p", "\p", "\p" );
- break;
- case kFileAtomRsrcForkFromDataFork : PrintLine( theCallBackPtr, kFileAtomRsrcForkFromDataForkText, "\p", "\p", "\p" );
- break;
- case kRsrcAtom : PrintLine( theCallBackPtr, kRsrcAtomText, "\p", "\p", "\p" );
- break;
- case kFontAtom :
- // -- Font Atom Description
- PrintLine( theCallBackPtr, kFontAtomText, "\p", "\p", "\p" );
-
- // -- Font Family Name
- PrintLine( theCallBackPtr, kFontFamilyNameText, pExtenderPBPtr->fFontCopyPBRec.fFamilyName, "\p", "\p" );
-
- // -- Font Family ID
- NumToString( pExtenderPBPtr->fFontCopyPBRec.fFamilyID, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kFontFamilyIDText, tempNumStr, "\p", "\p" );
-
- // -- Font Strike Size
- NumToString( pExtenderPBPtr->fFontCopyPBRec.fFontSize, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kFontFontSizeText, tempNumStr, "\p", "\p" );
-
- // -- Font Strike Style
- NumToString( pExtenderPBPtr->fFontCopyPBRec.fFontStyle, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kFontFontStyleText, tempNumStr, "\p", "\p" );
- break;
-
- case kActionAtom : PrintLine( theCallBackPtr, kActionAtomText, "\p", "\p", "\p" );
- break;
- }
- break;
- }
-
-
- // -- BASIC SOURCE INFO ----------------------------------------------------------------------
-
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fMessageID) {
- case kBeforePart :
- case kAfterPart :
- // -- SOURCE FILE ----------------------------------------------------------------------
- // -- Source Title
- PrintLine( theCallBackPtr, kSourceFileText, "\p", "\p", "\p" );
-
- MakeFilePath( &(pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fSourceFile), tempStr255 );
- PrintLine( theCallBackPtr, kFSSpecNameText, tempStr255, "\p", "\p" );
-
- NumToString( pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fSourcePartSize, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kPartSizeText, tempNumStr, "\p", "\p" );
- break;
- }
-
- // -- ATOM SOURCE SPECIFIC INFO ----------------------------------------------------------------------
-
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fMessageID) {
- case kInitialize :
- case kSuccess :
- break;
- case kBeforePart :
- case kAfterPart :
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fDataType) {
- case kFileAtomDataFork :
- case kFileAtomRsrcFork :
- case kFileAtomRsrcForkFromDataFork :
- break;
- case kRsrcAtom :
- // -- Resource Source Type
- BlockMove( &(pExtenderPBPtr->fRsrcCopyPBRec.fSourceRsrcType), &(tempStr255[2]), 4 );
- tempStr255[1] = '\'';
- tempStr255[6] = '\'';
- tempStr255[0] = 6;
- PrintLine( theCallBackPtr, kRsrcSourceRsrcTypeText, tempStr255, "\p", "\p" );
-
- // -- Resource Source ID
- NumToString( pExtenderPBPtr->fRsrcCopyPBRec.fSourceRsrcID, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kRsrcSourceRsrcIDText, tempNumStr, "\p", "\p" );
-
- break;
- case kFontAtom :
- // -- Font Source Type
- BlockMove( &(pExtenderPBPtr->fFontCopyPBRec.fSourceFontRsrcType), &(tempStr255[2]), 4 );
- tempStr255[1] = '\'';
- tempStr255[6] = '\'';
- tempStr255[0] = 6;
- PrintLine( theCallBackPtr, kFontSourceRsrcTypeText, tempStr255, "\p", "\p" );
-
- // -- Font Source ID
- NumToString( pExtenderPBPtr->fFontCopyPBRec.fSourceFontRsrcID, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kFontSourceRsrcIDText, tempNumStr, "\p", "\p" );
-
- break;
- default :
- break;
- }
- break;
- case kCancel :
- break;
- }
-
-
- // -- BASIC TARGET INFO ----------------------------------------------------------------------
-
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fMessageID) {
- case kBeforePart :
- case kAfterPart :
-
- // -- TARGET FILE ----------------------------------------------------------------------
- // -- Target Title
- PrintLine( theCallBackPtr, kTargetFileText, "\p", "\p", "\p" );
-
- // -- Target File Name
- MakeFilePath( &(pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fTargetFile), tempStr255 );
- PrintLine( theCallBackPtr, kFSSpecNameText, tempStr255, "\p", "\p" );
-
- // -- Target Start Position
- NumToString( pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fTargetPosStart, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kPosSizeText, tempNumStr, "\p", "\p" );
-
- // -- Target Part Size
- NumToString( pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fTargetPartSize, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kPartSizeText, tempNumStr, "\p", "\p" );
-
- // -- Target Total Size
- NumToString( pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fTotalTargetSize, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kTotalSizeText, tempNumStr, "\p", "\p" );
-
- // -- Installer Temp Dir ID
- if( pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fInstallerTempDirID != -1 ) {
- tempFSSpec.name[0] = 0;
- tempFSSpec.parID = pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fInstallerTempDirID;
- tempFSSpec.vRefNum = pExtenderPBPtr->fBasicPBRec.fCopyPBHeader.fTargetFile.vRefNum;
- MakeFilePath( &(tempFSSpec), tempStr255 );
- PrintLine( theCallBackPtr, kInstallerTempDirIDText, tempStr255, "\p", "\p" );
- }
-
- break;
-
- }
-
- // -- ATOM TARGET SPECIFIC INFO ----------------------------------------------------------------------
-
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fMessageID) {
- case kInitialize :
- case kSuccess :
- break;
- case kBeforePart :
- case kAfterPart :
- switch (pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fDataType) {
- case kFileAtomDataFork :
- case kFileAtomRsrcFork :
- case kFileAtomRsrcForkFromDataFork :
- break;
- case kRsrcAtom :
- // -- Resource Target Type
- BlockMove( &(pExtenderPBPtr->fRsrcCopyPBRec.fTargetRsrcType), &(tempStr255[2]), 4 );
- tempStr255[1] = '\'';
- tempStr255[6] = '\'';
- tempStr255[0] = 6;
- PrintLine( theCallBackPtr, kRsrcTargetRsrcTypeText, tempStr255, "\p", "\p" );
-
- // -- Resource Target ID
- NumToString( pExtenderPBPtr->fRsrcCopyPBRec.fTargetRsrcID, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kRsrcTargetRsrcIDText, tempNumStr, "\p", "\p" );
-
- // -- Resource Target Name
- PrintLine( theCallBackPtr, kRsrcTargetRsrcNameText, pExtenderPBPtr->fRsrcCopyPBRec.fTargetRsrcName, "\p", "\p" );
-
- // -- Resource Target Attributes
- NumToString( pExtenderPBPtr->fRsrcCopyPBRec.fTargetRsrcAttrs, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kRsrcTargetRsrcAttrsText, tempNumStr, "\p", "\p" );
-
- break;
- case kFontAtom :
- // -- Font Target Type
- BlockMove( &(pExtenderPBPtr->fFontCopyPBRec.fTargetFontRsrcType), &(tempStr255[2]), 4 );
- tempStr255[1] = '\'';
- tempStr255[6] = '\'';
- tempStr255[0] = 6;
- PrintLine( theCallBackPtr, kFontTargetRsrcTypeText, tempStr255, "\p", "\p" );
-
- // -- Font Target ID
- if( pExtenderPBPtr->fBasicPBRec.fEnvironmentHeader.fMessageID == kAfterPart ) {
- NumToString( pExtenderPBPtr->fFontCopyPBRec.fTargetFontRsrcID, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kFontTargetRsrcIDText, tempNumStr, "\p", "\p" );
- }
-
- // -- Font Target Name
- PrintLine( theCallBackPtr, kFontTargetRsrcNameText, pExtenderPBPtr->fFontCopyPBRec.fTargetFontRsrcName, "\p", "\p" );
-
- // -- Font Target Attributes
- NumToString( pExtenderPBPtr->fFontCopyPBRec.fTargetFontRsrcAttrs, (StringPtr)&tempNumStr );
- PrintLine( theCallBackPtr, kFontTargetRsrcAttrsText, tempNumStr, "\p", "\p" );
-
- break;
- default :
- break;
- }
- break;
- case kCancel :
- break;
- }
-
-
-
- // -- RESULT INFO ----------------------------------------------------------------------
- switch (pResultCode) {
- case kFatalError : PrintLine( theCallBackPtr, kEndCallPart1, kErrorRtnMessageText, kEndCallPart3, "\p" );
- break;
- case kContinueAsNormal : PrintLine( theCallBackPtr, kEndCallPart1, kOkRtnMessageText, kEndCallPart3, "\p" );
- break;
- case kCancelInstallation : PrintLine( theCallBackPtr, kEndCallPart1, kCancelRtnMessageText, kEndCallPart3, "\p" );
- break;
- case kCopiedData : PrintLine( theCallBackPtr, kEndCallPart1, kCopiedDataMessageText, kEndCallPart3, "\p" );
- break;
- }
-
-
- }
-
-
- #include "InstallerCallbackGlue.c"
-